/**
 * Copyright (C), 2016-2019, 赋拓物联网技术有限公司
 * FileName: UserService
 * Author:   Administrator
 * Date:     2019/6/12 13:28
 * Description: UserService
 * History:
 * <author>          <time>          <version>          <desc>
 * 作者姓名           修改时间           版本号              描述
 **/
package com.scs.application.modules.upms.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.scs.application.core.service.IBaseService;
import com.scs.application.modules.upms.entity.Role;
import com.scs.application.modules.upms.entity.User;
import com.scs.application.modules.upms.request.UserQueryRequest;
import com.scs.application.modules.upms.vo.UserVO;

import java.util.List;

/**
 * @Description:UserService
 **/
public interface UserService extends IBaseService<User> {
    /**
     * CheckUserKey 避免重复Key
     *
     * @param userKey
     * @return
     */
    boolean existLoginKey(String userKey);


    /**
     * checkUserMobile 避免重复mobile
     *
     * @param mobile
     * @param userId
     * @return
     */
    boolean checkUserMobile(String mobile, String userId);

    /**
     * checkUserEmail 避免重复email
     *
     * @param email
     * @param userId
     * @return
     */
    boolean checkUserEmail(String email, String userId);

    /**
     * 依据登录账号进行查找
     *
     * @param loginKey
     * @return
     */
    User findByLoginKey(String loginKey);

    /**
     * 获取用户信息
     *
     * @param userKey
     * @return
     */
    UserVO findInfoByLoginKey(String userKey);


    /**
     * 根据微信公众号ID进行查找
     *
     * @param openId
     * @return
     */
    User findByWxmpOpenId(String openId);

    UserVO findInfoByWxmpOpenId(String openId);

    /**
     * 根据手机号进行查找
     *
     * @param mobile
     * @return
     */
    User findByMobile(String mobile);

    /**
     * 根据手机号进行查找
     *
     * @param mobile
     * @return
     */
    List<User> findAllByMobile(String mobile);

    UserVO findInfoByMobile(String mobild);

    /**
     * 根据邮箱进行查找
     *
     * @param email
     * @return
     */
    User findByEmail(String email);

    UserVO findInfoByEmail(String email);

    List<UserVO> list(UserQueryRequest request);

    /**
     * selectUsers 查询所有用户信息
     *
     * @param request
     * @return
     */
    IPage<UserVO> page(UserQueryRequest request);


    /**
     * 根据登录名（可多个用,隔开）
     *
     * @param loginKey
     * @returnUser
     */
    List<User> findAllByLoginKey(String loginKey);

    /**
     * 修改用户密码
     *
     * @param userId
     * @param oldPassword
     * @param newPassword
     * @return
     */
    boolean modifyPassword(String userId, String oldPassword, String newPassword);

    /**
     * 重置用户密码为默认密码
     *
     * @param userId
     */
    void resetPassword(String userId);


    /**
     * 解除指定用户的指定角色
     *
     * @param userId 用户ID
     * @param roleId 角色ID
     * @return 成功返回true，否则返回false
     */
    boolean unassignRole(String userId, String roleId);

    /**
     * 为多个用户分配指定角色
     *
     * @param userIdList
     * @param roleId
     */
    boolean assignRole(List<String> userIdList, String roleId);

    /**
     * 获取指定用户的角色信息
     *
     * @param userId 用户ID
     * @return
     */
    List<Role> getUserRoles(String userId);

    /**
     * 改变用户角色
     *
     * @param loginKey    登录账号
     * @param toRoleCodes
     */
    void changeRoles(String loginKey, List<String> toRoleCodes);

    /**
     * 改变登录账号
     *
     * @param oldLoginKey 旧的登录账号
     * @param newLoginKey 新的登录账号
     */
    void changeLoginKey(String oldLoginKey, String newLoginKey);

    /**
     * 批量添加用户信息
     * @param uservo
     * @return
     */
    User addUser(UserVO uservo);
}
